package org.example.config;

import io.swagger.v3.oas.models.Components;
import io.swagger.v3.oas.models.OpenAPI;
import io.swagger.v3.oas.models.info.Info;
import io.swagger.v3.oas.models.info.License;
import io.swagger.v3.oas.models.security.SecurityRequirement;
import io.swagger.v3.oas.models.security.SecurityScheme;
import io.swagger.v3.oas.models.servers.Server;
import org.springdoc.core.models.GroupedOpenApi;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;

/**
 * OpenAPI配置类
 * 支持多端登录的API文档配置
 */
@Configuration
@Primary
public class OpenApiConfig {

    @Bean
    @Primary
    public OpenAPI customOpenAPI() {
        return new OpenAPI()
                .info(new Info()
                        .title("ListOKR 多端登录API文档")
                        .description("支持多端登录的OKR管理系统API文档，包含平台端、企业端、用户端三个子系统")
                        .version("v1.0.0")
                        .license(new License().name("Apache 2.0").url("http://springdoc.org")))
                .addServersItem(new Server().url("/api").description("API服务器根路径"))
                .addServersItem(new Server().url("/api/platform").description("平台端API服务器"))
                .addServersItem(new Server().url("/api/enterprise").description("企业端API服务器"))
                .addServersItem(new Server().url("/api/user").description("用户端API服务器"))
                .components(new Components()
                        // 平台端认证方案
                        .addSecuritySchemes("platformBearerAuth", 
                                new SecurityScheme()
                                        .name("Platform-Token")
                                        .type(SecurityScheme.Type.APIKEY)
                                        .in(SecurityScheme.In.HEADER)
                                        .description("平台端认证Token，直接输入token值"))
                        // 企业端认证方案
                        .addSecuritySchemes("enterpriseBearerAuth",
                                new SecurityScheme()
                                        .name("Enterprise-Token")
                                        .type(SecurityScheme.Type.APIKEY)
                                        .in(SecurityScheme.In.HEADER)
                                        .description("企业端认证Token，直接输入token值"))
                        // 工作台认证方案
                        .addSecuritySchemes("workbenchBearerAuth",
                                new SecurityScheme()
                                        .name("Workbench-Token")
                                        .type(SecurityScheme.Type.APIKEY)
                                        .in(SecurityScheme.In.HEADER)
                                        .description("工作台认证Token，直接输入token值"))
                        // 个人中心认证方案
                        .addSecuritySchemes("personalBearerAuth",
                                new SecurityScheme()
                                        .name("Personal-Token")
                                        .type(SecurityScheme.Type.APIKEY)
                                        .in(SecurityScheme.In.HEADER)
                                        .description("个人中心认证Token，直接输入token值"))
                        // 兼容模式：Authorization header
                        .addSecuritySchemes("authorizationBearerAuth",
                                new SecurityScheme()
                                        .name("Authorization")
                                        .type(SecurityScheme.Type.APIKEY)
                                        .in(SecurityScheme.In.HEADER)
                                        .description("兼容模式：Authorization header，直接输入token值")))
                // 为所有接口添加认证要求
                .addSecurityItem(new SecurityRequirement().addList("platformBearerAuth"))
                .addSecurityItem(new SecurityRequirement().addList("enterpriseBearerAuth"))
                .addSecurityItem(new SecurityRequirement().addList("workbenchBearerAuth"))
                .addSecurityItem(new SecurityRequirement().addList("personalBearerAuth"))
                .addSecurityItem(new SecurityRequirement().addList("authorizationBearerAuth"));
    }

    /**
     * 文件管理接口分组
     */
    @Bean
    public GroupedOpenApi fileApi() {
        return GroupedOpenApi.builder()
                .group("文件管理")
                .pathsToMatch("/file/**")
                .build();
    }

    /**
     * 平台端接口分组
     */
    @Bean
    public GroupedOpenApi platformApi() {
        return GroupedOpenApi.builder()
                .group("平台端")
                .pathsToMatch("/platform/**")
                .build();
    }

    /**
     * 企业端接口分组
     */
    @Bean
    public GroupedOpenApi enterpriseApi() {
        return GroupedOpenApi.builder()
                .group("企业端")
                .pathsToMatch("/enterprise/**")
                .build();
    }

    /**
     * 工作台接口分组
     */
    @Bean
    public GroupedOpenApi workbenchApi() {
        return GroupedOpenApi.builder()
                .group("工作台")
                .pathsToMatch("/user/workbench/**")
                .build();
    }

    /**
     * 个人中心接口分组
     */
    @Bean
    public GroupedOpenApi personalApi() {
        return GroupedOpenApi.builder()
                .group("个人中心")
                .pathsToMatch("/user/personal/**")
                .build();
    }
}




